﻿// Колесов 
using System;
using ComLaoBase;

namespace Transfer
{
    public class LaoKAG
    {
        /// <summary> Виды адресов доставки
        /// </summary>
        public enum AdrType
        {
            Pay = 1,    // Адрес для оплаты
            Recv = 2    // Адрес для доставки
        };

        LAOBase _laoKAG;
        LAOBase _laoKagAdr;
        LAOBase _laoKagSch;
        
        public LaoKAG()
        {
            _laoKAG = LAO_DB.Open("TPtnObj", "");
            _laoKagAdr = _laoKAG.GetSubObject("TFiliaObj");    // Адреса контрагента
            _laoKagSch = _laoKAG.GetSubObject("TPtnSchObj");   // Счета контрагента
        }

        public void Close()
        {
            _laoKagAdr.Close();
            _laoKagSch.Close();
            _laoKAG.Close();
        }

        /// <summary> По шифру контрагента находит его запись и возвращает 
        /// Rcd найденной записи.
        /// Если запись не найдена - возвращает 0.
        /// </summary>
        /// <param name="code">Код</param>
        /// <returns>Rcd</returns>
        public int GetRcdByCode(string code)
        {
            _laoKAG.Sort("Index_3");
            if (_laoKAG.Find(1, code.Trim(), 0, 0, 0, 0, 0, 0, 0, 0, 0))
                return _laoKAG.GetInteger("Rcd");
            else
                return 0;
        }

        /// <summary> По шифру контрагента возвращает набор его параметров
        /// </summary>
        /// <param name="code">Код</param>
        /// <param name="codeIsBar">Тип кода: True-штрихкод; False-код ИС-ПРО</param>
        /// <returns>Набор параметров</returns>
        public KagPrm GetPrmByCode(string code)
        {
            int Rcd = GetRcdByCode(code);
            if (Rcd == 0) return null;  // Запись не найдена

            KagPrm prm = new KagPrm();
            
            prm.Cd = code.Trim();                       
            prm.Rcd = Rcd;
            prm.Nm = _laoKAG.GetString("NmSh","");       // Краткое название контрагента
            prm.RcdPlat = _laoKAG.GetInteger("RcdPlat"); // Rcd плательщика
            if (prm.RcdPlat == 0)                       // Если нулевой
                prm.RcdPlat = Rcd;                      // плательщик - сам контрагент
            prm.RcdPrice = _laoKAG.GetInteger("Prc");    // Rcd прейскуранта

            return prm;
        }

        /// <summary> Получение Rcd адреса указанного типа для заданного контрагента
        /// </summary>
        /// <param name="RcdKag">Rcd контрагента</param>
        /// <param name="adrType">Тип искомого адреса</param>
        /// <returns>Rcd найденного адреса или ноль</returns>
        public int GetAdrRcd(Int32 RcdKag, AdrType adrType)
        {
            byte atype = Convert.ToByte(adrType);
            int rcdAdr = 0;
            _laoKAG.Sort("Index_1"); // По Rcd
            if (!_laoKAG.Find(1, RcdKag.ToString().Trim(), 0, 0, 0, 0, 0, 0, 0, 0, 0))
                return 0;   // Запись по Rcd не нашли

            // Перебор адресов найденного контрагента
            _laoKagAdr.First();
            while (!_laoKagAdr.IsEOO())
            {
                byte flg = Convert.ToByte(_laoKagAdr.GetInteger("Flg"));
                if (flg == atype)
                {
                    rcdAdr = _laoKagAdr.GetInteger("Rcd");
                    break;          // Нашли искомый адрес
                }
                _laoKagAdr.Next();
            }

            return rcdAdr;
        }

        /// <summary> Получение Rcd счета по его номеру.
        /// При передаче пустого параметра возвращает номер первого счета в списке.
        /// </summary>
        /// <param name="rcdkag">Rcd контрагента</param>
        /// <param name="sch">Номер счета</param>
        /// <returns>Rcd</returns>
        public int GetSchRcdByCode(int rcdkag, string sch)
        {
            _laoKAG.Sort("Index_1"); // По Rcd
            if (!_laoKAG.Find(1, rcdkag.ToString().Trim(), 0, 0, 0, 0, 0, 0, 0, 0, 0))
                return 0;   // Запись по Rcd не нашли

            // Контрагент нашелся, найдем Rcd указанного счета в списке его счетов
            int rcd = 0;
            sch = sch.Trim();
            _laoKagSch.First();
            // Если задан пустой номер счета, возвращаем Rcd первой записи. 
            // Т.е. первый встретившийся счет.
            if (!_laoKagSch.IsEOO() && sch == string.Empty)
                return _laoKagSch.GetInteger("Rcd");

            while (!_laoKagSch.IsEOO())   // Перебираем счета
            {
                if (_laoKagSch.GetString("Nsc", "").Trim() == sch) // Счет найден.
                {
                    rcd = _laoKagSch.GetInteger("Rcd");
                    break;
                }
                _laoKagSch.Next();
            }
            return rcd;
        }
    }

    /// <summary> Набор параметров, описывающих контрагента
    /// </summary>
    public class KagPrm
    {
        /// <summary> Код контрагента
        /// </summary>
        public String Cd = string.Empty;

        /// <summary> Наименование контрагента
        /// </summary>
        public String Nm = string.Empty;  

        /// <summary> Rcd контрагента
        /// </summary>
        public Int32 Rcd = 0;          

        /// <summary> Rcd плательщика
        /// </summary>
        public Int32 RcdPlat = 0;

        /// <summary> Rcd прейскуранта
        /// </summary>
        public Int32 RcdPrice = 0;

    }
}
